package com.clp.util.hutool.system;

import com.clp.util.hutool.core.convert.Convert;
import com.clp.util.hutool.core.lang.Console;
import com.clp.util.hutool.core.util.StrUtil;

import java.util.Locale;

public class SystemUtil {

    /**
     * 取得系统属性，如果因为Java安全的限制而失败，则将错误打在Log中，然后返回 defaultValue
     *
     * @param name         属性名
     * @param defaultValue 默认值
     * @return 属性值或defaultValue
     * @see System#getProperty(String)
     * @see System#getenv(String)
     */
    public static String get(String name, String defaultValue) {
        return StrUtil.nullToDefault(get(name, false), defaultValue);
    }

    /**
     * 取得系统属性，如果因为Java安全的限制而失败，则将错误打在Log中，然后返回 {@code null}
     *
     * @param name  属性名
     * @param quiet 安静模式，不将出错信息打在<code>System.err</code>中
     * @return 属性值或{@code null}
     * @see System#getProperty(String)
     * @see System#getenv(String)
     */
    public static String get(String name, boolean quiet) {
        String value = null;
        try {
            value = System.getProperty(name);
        } catch (SecurityException e) {
            if (false == quiet) {
                Console.error("Caught a SecurityException reading the system property '{}'; " +
                        "the SystemUtil property value will default to null.", name);
            }
        }

        if (null == value) {
            try {
                value = System.getenv(name);
            } catch (SecurityException e) {
                if (false == quiet) {
                    Console.error("Caught a SecurityException reading the system env '{}'; " +
                            "the SystemUtil env value will default to null.", name);
                }
            }
        }

        return value;
    }

    public static String get(String key) {
        return get(key, null);
    }

    public static boolean getBoolean(String key, boolean defaultValue) {
        String value = get(key);
        if (value == null) {
            return defaultValue;
        }

        value = value.trim().toLowerCase();
        if (value.isEmpty()) {
            return true;
        }

        return Convert.toBool(value, defaultValue);
    }

}
